package org.shoukaiseki.common.utils

import org.shoukaiseki.common.domain.UniqueIdDomain
import org.shoukaiseki.common.exception.MessageVirtualException

/**
 * @{code
 *
 * @author shoukaiseki
 * ブログ http://www.shoukaiseki.top
 * E-メール jiang28555@Gmail.com
 * @date 2021-04-23 01:42:35
 * }
 */
object MybatisUtils {

    /** 下划线  */
    @JvmField
    val SEPARATOR_ID = "_id"

    /**
     * 仅支持字母、数字、下划线、空格、逗号、小数点（支持多个字段排序）
     */
    @JvmField
    val SQL_PATTERN = """[a-zA-Z0-9_\ \,\.]+"""

    /**
     * 检查字符，防止注入绕过
     */
    @JvmStatic
    fun escapeTableOrColumnSql(value: java.lang.String?): java.lang.String? {
        if (StringUtils.isNotEmpty(value) && !isValidTableOrColumnSql(value)) {
            throw MessageVirtualException("参数不符合规范，不能进行查询")
        }
        return value
    }

    /**
     * 验证 表名,字段名 语法是否符合规范
     */
    @JvmStatic
    fun isValidTableOrColumnSql(value: java.lang.String?): Boolean {
        if(value==null){
            return true
        }
        Regex(SQL_PATTERN)
        return value.matches(SQL_PATTERN)
    }

    @JvmStatic
    @JvmOverloads
   fun sum(column: String,alias:String=column): String {
        return "ifnull(sum(ifnull(${column},0)),0) as $alias"
    }

    @JvmStatic
    @JvmOverloads
    fun max(column: String,alias:String=column): String {
        return "max(${column}) as $alias"
    }

    @JvmStatic
    @JvmOverloads
    fun min(column: String,alias:String=column): String {
        return "min(${column}) as $alias"
    }


//    @JvmStatic
//    fun uniqueIdDomainListToLongArray(list:List<UniqueIdDomain>):Long[]{
//        return list.stream().map(UniqueIdDomain::getId).toArray(java.lang.Long[]::new)
//    }

//    @JvmStatic
//    fun uniqueIdDomainListToLongArray(list: List<UniqueIdDomain>): LongArray? {
//        return list.stream().map { obj: UniqueIdDomain -> obj.id }.toArray
//    }

    @JvmStatic
    fun uniqueIdDomainListToLongArray(list: List<UniqueIdDomain>): Array<Long> {
        val tmp = ArrayList<Long>()
        list.forEach{
            tmp.add(it.id)
        }
        return tmp.toTypedArray()
    }
}
